package IHM;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;

import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import Controle.Controleur;
import Metier.Page;
import Metier.Projet;

/**
 * Classe permettant l'affichage des fenetre de saisie
 * type renomer un projet, nouveau projet etc..
 * @author Aubry Thomas
 * @author Bouchet Sylvain
 * @author Fauvel Alexis
 * @author Lessieur Jocelyn
 * @author Mathias Bastien 
 * @author Teuf Antoine
 * @version 1.0
 */
public class FenetreSaisie extends JDialog implements ActionListener,KeyListener
{
        
		/**
		 * Label pour informer l'utilisateur du contenu demandé
		 */
        private JLabel label;
        
        /**
         * JTextFeild permetant de contenir les informations demandées à l'utilisateur
         */
        private JTextField tf,tf2;
        
        /**
         * Bouton pour la validation de l'action ou l'annuler
         */
        private JButton valid,annule;
        
        /**
         * Permet de contenir l'instance de l'IHM de l'application
         */
        private IHM ihm;
        
        /**
         * Constructeur de la classe FenetreSaisie 
         * @param objetAjout	nom de l'action lié à la fenetre
         * @param ihm			la classe IHM
         */
        public FenetreSaisie(String objetAjout, IHM ihm)
        {
                this.ihm=ihm;
                
                if(objetAjout.equals("Renommer un Projet"))
                	setTitle(objetAjout);
                else
                	setTitle("Ajout "+objetAjout);
                setLocationRelativeTo(null);
                setModal(true);
                
                JPanel panelTitre = new JPanel();
                JPanel boutons= new JPanel();
                JPanel panelAjout = new JPanel();
                panelAjout.setLayout(new BorderLayout());
                
                if(objetAjout.equals("Renommer un Projet"))
                	label = new JLabel("Nouveau nom : ");
                else if(objetAjout.equals("Page")){
                	label = new JLabel("Titre de la page : ");
                }
                else
                	label = new JLabel(objetAjout+" : ");
                
                tf = new JTextField(20);
                tf.addActionListener(this);
                tf.addKeyListener(this);
                
                
                if(objetAjout.equals("Projet")){
                	panelTitre.setLayout(new GridLayout(2, 1));
                	JPanel grid1=new JPanel(new FlowLayout(FlowLayout.RIGHT));
                	JPanel grid2=new JPanel(new FlowLayout(FlowLayout.RIGHT));
                	
                	grid1.add(label);
                	grid1.add(tf);

                	JLabel label2=new JLabel("Auteur : ");
                	tf2=new JTextField(20);
                	tf2.addActionListener(this);
                	if(!ihm.getControleur().getProjets().isEmpty())
                    	tf2.setText(ihm.getControleur().getProjets().get(ihm.getControleur().getProjets().size()-1).getAuteur());
                    grid2.add(label2);
                    grid2.add(tf2);

                    panelTitre.add(grid1);
                    panelTitre.add(grid2);

                }
                else{
                	panelTitre.add(label);
                    panelTitre.add(tf);
                    
                }
                
                if(objetAjout.equals("Renommer un Projet"))
                	valid = new JButton("Renommer");
                else
                	valid = new JButton("Ajouter");
                
                valid.addActionListener(this);
                valid.setEnabled(false);
                annule=new JButton("Annuler");
                annule.addActionListener(this);
                
                boutons.add(valid);
                boutons.add(annule);
                
                panelAjout.add(panelTitre);
                panelAjout.add(boutons, "South");
                
                add(panelAjout);
                
                pack();
                setVisible(true);
        }
        
        public void actionPerformed(ActionEvent e) {
        	if(e.getSource()==valid || ((e.getSource()==tf || e.getSource()==tf2) && valid.isEnabled())){
        		
        		String titre = this.getTitle().split(" ")[1];
        		
        		if(titre.equals("Page")){
        			Controleur ctrl = ihm.getControleur();
        			boolean existe=false;
        			for(Page p:ctrl.getProjetEnCours().getPages()){
        				if(tf.getText().equals(p.getTitrePage()))
        					existe=true;
        			}
        			if(existe){
        				JOptionPane.showMessageDialog(this, "Une page de ce titre existe déjà dans votre projet");
        				tf.setText("");
        				valid.setEnabled(false);
        			}
        			else{
	        			
	        			ihm.getControleur().getProjetEnCours().creationPage(tf.getText());
	        			ihm.getControleur().getProjetEnCours().setPageEnCours(ihm.getControleur().getProjetEnCours().getPage(ihm.getControleur().getProjetEnCours().getPages().size()-1));
	        			ihm.majArbre();
	        			ihm.getMB().activerBoutons(false);
	            		
	            		dispose();
        			}
        		}
        		else if(titre.equals("Projet") || getTitle().equals("Renommer un Projet")){
        			Controleur ctrl = ihm.getControleur();
        			boolean existe=false;
        			for(Projet p:ctrl.getProjets()){
        				if(tf.getText().equals(p.getNom()))
        					existe=true;
        			}
        			if(existe){
        				JOptionPane.showMessageDialog(this, "Erreur ! Projet de ce nom déjà existant !");
        				tf.setText("");
        				valid.setEnabled(false);
        			}
        			else{
        				if( tf.getText().contains("\\") || tf.getText().contains("/")||tf.getText().contains(":") ||
        					tf.getText().contains("*") || tf.getText().contains("?") || tf.getText().contains("\"") || 
        					tf.getText().contains("<") || tf.getText().contains(">") || tf.getText().contains("|")){
        					JOptionPane.showMessageDialog(this, "Erreur ! Le nom de projet ne peut pas contenir les caractères suivants : \\ / : * ? \" < > |");
        					tf.setText("");
        					valid.setEnabled(false);
        				}
        				else if (tf.getText().equals(".") || tf.getText().equals("..")) {
        					JOptionPane.showMessageDialog(this, "Erreur ! Le nom de projet ne peut être '.' ou '..'");
        					tf.setText("");
        					valid.setEnabled(false);
        				}
        				else{
        					if(getTitle().equals("Renommer un Projet")){
        						String oldName=ctrl.getProjetEnCours().getNom();
        						ctrl.getProjetEnCours().setNom(tf.getText());
    		        			ctrl.setProjetEnCours(ihm.getControleur().getProjetByNom(tf.getText()));
    		        			ctrl.getProjetEnCours().setPageEnCours(ctrl.getProjetEnCours().getPage(0));
    		        			for(Page p:ctrl.getProjetEnCours().getPages()){
    		        				p.setProjet(ctrl.getProjetEnCours());
    		        			}
    		        			ihm.majVisu();
    		        			ihm.majArbre();
    		        			File rep=new File(ctrl.getRacine()+"/"+oldName);
    		        			rep.renameTo(new File(ctrl.getRacine()+"/"+ctrl.getProjetEnCours().getNom()));
    		            		dispose();
        					}
        					else{
			        			ctrl.creationProjet(tf.getText(),tf2.getText());
			        			ctrl.setProjetEnCours(ihm.getControleur().getProjetByNom(tf.getText()));
			        			ctrl.getProjetEnCours().setPageEnCours(ctrl.getProjetEnCours().getPage(0));
			        			ihm.majVisu();
			        			ihm.getMB().activerGenerer(!ctrl.getProjets().isEmpty());
			        			ihm.majArbre();
			        			ihm.getMB().activerBoutons(false);
        					}
	
		            		dispose();
        				}
        			}
        		}
        		else if(titre.equals("Sous-titre")){
        			ihm.getControleur().getProjetEnCours().getPageEnCours().insererSousTitre(tf.getText());
        			ihm.majVisu();
        			dispose();
        		}
        		else if(titre.equals("Titre")){
        			ihm.getControleur().getProjetEnCours().getPageEnCours().insererTitre(tf.getText());
        			ihm.majVisu();
        			dispose();
        		} 			
            }
        	else if(e.getSource()==annule)
        		dispose();
        }

		@Override
		public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub
			
			
		}
		@Override
		public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub	
		}
		
		@Override
		public void keyTyped(KeyEvent e) {
			// TODO Auto-generated method stub
			if(e.getKeyChar()==' ' || (new Character(e.getKeyChar())).hashCode()==KeyEvent.VK_DELETE || (new Character(e.getKeyChar())).hashCode()==KeyEvent.VK_BACK_SPACE){
				boolean b=false;
				for(char c:tf.getText().toCharArray()){
					if(c!=' '){
						b=true;
					}
				}
				valid.setEnabled(b);
			}
			else if((new Character(e.getKeyChar())).hashCode()!=KeyEvent.VK_ENTER){
				valid.setEnabled(true);
			}
		}
}
